# 2、在1基础上，将前景目标进行分割，进一步使用不同颜色矩形框标记，并在命令行窗口中输出每个矩形框的位置和大小。
import cv2 as cv

videoFileName = r"D:\AI\Picture\vtest.avi"
# 加载视频
cap = cv.VideoCapture(videoFileName)
# 创建混合高斯模型的背景前景分割算法对象
fgbg = cv.createBackgroundSubtractorMOG2()
thresh = 200

while True:
    # ret表示是否成功获取帧, frame是捕获到的图像
    ret, frame = cap.read()
    if not ret:
        break
    # 获取前景的蒙板
    fgmask = fgbg.apply(frame)
    # 对前景蒙版阈值化去除噪声
    _, fgmask = cv.threshold(fgmask, 30, 0xff, cv.THRESH_BINARY)

    # 获取背景图像
    bgImage = fgbg.getBackgroundImage()
    # 查找轮廓 参数：第一个是输入图像，第二个是轮廓检索模式，第三个是轮廓近似方法
    fgImage, cnts, hierarchy = cv.findContours(fgmask.copy(), cv.RETR_EXTERNAL,
                                               cv.CHAIN_APPROX_SIMPLE)

    count = 0
    for c in cnts:
        area = cv.contourArea(c)
        # 如果轮廓的面积小于设定的阈值，则舍弃
        if (area < thresh):
            continue
        # 计算有效轮廓的数量
        count += 1

        # 获取矩形边框:用一个最小的矩形，把找到的形状包起来
        x, y, w, h = cv.boundingRect(c)
        # 画出矩行
        cv.rectangle(frame, (x, y), (x + w, y + h), (0xff, 0, 0), 2)
        cv.rectangle(fgImage, (x, y), (x + w, y + h), (0xff, 0, 0), 2)
        print("矩形{}：X={} Y={} 宽={} 高={}".format(count, x, y, w, h))

        # 写数字 各参数依次是：图片，添加的文字，左上角坐标，字体，字体大小，颜色，字体粗细
        cv.putText(frame, str(count), (x, y), cv.FONT_HERSHEY_PLAIN, 1, (0, 0xff, 0), 1)

    print("共检测到：{} 个目标".format(count))
    print()
    cv.imshow("source", frame)
    cv.imshow("fgImage", fgImage)
    cv.imshow("bgImage", bgImage)

    # 每一帧间隔30ms
    key = cv.waitKey(30)
    # 按下ESC键(27)，退出
    if key == 27:
        break

# 释放视频资源
cap.release()
# 关闭所有窗口
cv.destroyAllWindows()
